import ast
import jsonpath
from common.mylogger import logger

class MyAssert:

    def assert_response_value(self, check_str, response_dict):
        """

        :param check_str: 从excel中读取的断言列，是一个列表形式的字符串，里面的成员是一个断言
        :param response_dict:接口请求后的相应数据，是一个字典类型
        :return:None
        """
        # 把字符串转换成python列表
        check_list = ast.literal_eval(check_str)
        print(check_list)
        # 所有断言的比对结果存放列表
        check_res = []
        for check in check_list:
            logger.info("要断言的内容为：{}".format(check))
            # 通过josnpath表达式，从响应结果中拿到实际结果
            actual = jsonpath.jsonpath(response_dict, check["expr"])
            if isinstance(actual,list):
                actual = actual[0]
            logger.info("从响应结果中提取到的值为:{}".format(actual))
            logger.info("期望结果为:{}".format(check["expected"]))
            # 与实际结果做比对
            if check["type"] == "eq":
                logger.info("比对两个值是否相等")
                logger.info("比对结果为：{}".format(check_res.append(actual == check["expected"])))
                check_res.append(actual == check["expected"])

        if False in check_res:
            logger.error("部分断言失败！，请查看比对结果为False的")
            raise AssertionError
        else:
            logger.info("所有断言成功！")